﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;

namespace LM.Tela.Desktop
{
    public partial class frmVeiculo : Form
    {
        
        public frmVeiculo()
        {
            InitializeComponent();
            BindTipoDeVeiculo();
            BindMarca();
            BindCliente();
        }

        private void BindMarca()
        {
            var servicoDeMarca = FabricaGenerica.Crie<IServicoDeMarca>();
            var marcas = servicoDeMarca.ConsulteTodos();
            cmbMarca.ValueMember = "Codigo";
            cmbMarca.DisplayMember = "Descricao";
            cmbMarca.DataSource = marcas;
            cmbMarca.SelectedIndex = -1;
        }

        private void BindTipoDeVeiculo()
        {
            cmbTipoDeVeiculo.DataSource = Enum.GetValues(typeof(EnumTipoDeVeiculo));
            cmbTipoDeVeiculo.SelectedIndex = -1;
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            var servico = FabricaGenerica.Crie<IServicoDeVeiculo>();

            if (!EmEdicao())
            {
                servico.Cadastre(ObtemVeiculoDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG01);
            }
            else
            {
                servico.Atualize(ObtemVeiculoDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG02);
            }

            PrepareTelaParaNovoRegistro();
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(txtCodigo.Text) && txtCodigo.Enabled == false;
        }

        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueItensJaCadastrados();
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
        }

        private void CarregueItensJaCadastrados()
        {
            var veiculos = (from v in FabricaGenerica.Crie<IServicoDeVeiculo>().ConsulteTodos()
                            select new
                                {
                                    Codigo = v.Codigo,
                                    Placa = v.Placa,
                                    Marca = v.Modelo.Marca.Descricao,
                                    Modelo = v.Modelo.Descricao,
                                    Ano = v.Ano,
                                    Cor = v.Cor,
                                    TipoDeVeiculo = (EnumTipoDeVeiculo)v.TipoDeVeiculo,
                                    Cliente = v.Cliente.Nome
                                }).ToList();

            grdVeiculo.DataSource = veiculos;
        }

        private void LimpeCamposEdicao()
        {
            txtCodigo.Text = string.Empty;
            txtAno.Text = string.Empty;
            txtCor.Text = string.Empty;
            txtPlaca.Text = string.Empty;
            cmbMarca.SelectedIndex = -1;
            cmbModelo.SelectedIndex = -1;
            cmbTipoDeVeiculo.SelectedIndex = -1;
        }

        private DtoVeiculo ObtemVeiculoDoFormulario()
        {
            int codigo;
            int.TryParse(txtCodigo.Text, out codigo);
            
            var veiculo = new DtoVeiculo();
            veiculo.Codigo = codigo;
            veiculo.Ano = Convert.ToInt32(txtAno.Text.Trim());
            veiculo.Cor = txtCor.Text.Trim();
            veiculo.Placa = txtPlaca.Text.Trim();
            veiculo.TipoDeVeiculo = (EnumTipoDeVeiculo)cmbTipoDeVeiculo.SelectedItem;

            var servicoDeModelo = FabricaGenerica.Crie<IServicoDeModelo>();
            var modelo = (DtoModelo) cmbModelo.SelectedItem;
            veiculo.Modelo = servicoDeModelo.Consulte(modelo.Codigo);

            var servicoDeCliente = FabricaGenerica.Crie<IServicoDeCliente>();
            var cliente = (DtoCliente)cmbCliente.SelectedItem;
            veiculo.Cliente = servicoDeCliente.Consulte(cliente.Codigo);
            
            return veiculo;
        }
        
        private void BindModelo(int codigoMarca)
        {
            var servicoDeModelo = FabricaGenerica.Crie<IServicoDeModelo>();

            var modelos = servicoDeModelo.ConsultaTodosPorMarca(codigoMarca);
            cmbModelo.ValueMember = "Codigo";
            cmbModelo.DisplayMember = "Descricao";
            cmbModelo.DataSource = modelos;
            cmbModelo.SelectedIndex = -1;
        }

        private void BindCliente()
        {
            var servicoDeCliente = FabricaGenerica.Crie<IServicoDeCliente>();

            var clientes = servicoDeCliente.ConsulteTodos();
            cmbCliente.ValueMember = "Codigo";
            cmbCliente.DisplayMember = "Nome";
            cmbCliente.DataSource = clientes;
            cmbCliente.SelectedIndex = -1;
        }

        private void cmbMarca_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbMarca.Text != "")
            {
                var marca = (DtoMarca)cmbMarca.SelectedItem;
                BindModelo(marca.Codigo);
            }
        }

        private void frmVeiculo_Load(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void grdVeiculo_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                var grid = ((dynamic)grdVeiculo.DataSource)[e.RowIndex];
                var servicoDeVeiculo = FabricaGenerica.Crie<IServicoDeVeiculo>();
                int codigo = grid.Codigo;
                var veiculo = servicoDeVeiculo.Consulte(codigo);
                txtCodigo.Text = veiculo.Codigo.ToString();
                txtCodigo.Enabled = false;
                txtPlaca.Text = veiculo.Placa;
                txtCor.Text = veiculo.Cor;
                txtAno.Text = veiculo.Ano.ToString();
                cmbMarca.SelectedValue = veiculo.Modelo.Marca.Codigo;
                BindModelo(veiculo.Modelo.Marca.Codigo);
                cmbModelo.SelectedValue = veiculo.Modelo.Codigo;
                cmbCliente.SelectedValue = veiculo.Cliente.Codigo;
                cmbTipoDeVeiculo.SelectedItem = veiculo.TipoDeVeiculo;
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia("Modelo não selecionado para edição.");
            }
            else
            {
                var servicoDeVeiculo = FabricaGenerica.Crie<IServicoDeVeiculo>();
                servicoDeVeiculo.Exclua(int.Parse(txtCodigo.Text));

                PrepareTelaParaNovoRegistro();
            }
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {

        }
    }
}
